package com.cskaoyan.javase.oop3._2inner._1member._0introduction;
/**
 * 在具体理解成员内部类成员特点之前,先明确:
 *      1.成员内部类可以看成外围类的一个成员,这意味着什么?成员内部类有何特殊之处?
 *          ---> 要想得到成员内部类对象,需要先创建外围类对象,在外围类对象的基础上,才能够创建成员内部类对象.
 *          原理:这是通过编译器,在编译成员内部类代码时,将外围类对象的引用添加到成员内部类的成员变量列表中实现.成员内部类对象,必须持有外围类对象的引用
 *          ---> 所以先有外围类对象,才有成员内部类对象
 *
 *      2.成员内部类始终仍然是一个类,创建它的对象也需要类加载.而且类加载的顺序应该是
 *          先类加载外围类,再类加载成员内部类
 *          a.成员内部类被设计成依赖外围类而存在，如果一个非静态内部类有了静态成员，静态成员不依托于任何内部类实例，就破坏了这种设计的目的。
 *
 *          b.没有必要。静态成员的目的是脱离对象而使用一个变量或者方法，完全可以将它们定义到外围类中，然后去使用。
 *          所以成员内部类没有静态声明,除此之外,和普通类是一样的
 *
 *
 *
 * 成员内部类是最普通的内部类，它定义在另一个类的成员位置， 可以看成该类的一个成员。
 * 语法：
 * 代码块 1. 成员内部类语法
 *      //外围类
 *      [访问权限修饰符] class EnclosedClazz{
 *          //成员内部类
 *          [访问权限修饰符] class InnerClazz{
 *          }
 *      }
 *
 * 成员内部类的特点:
 * 主要从以下几个角度分析：
 *      1. 访问权限修饰符,有四种访问权限,都可以使用
 *      2. 成员特点:没有static声明,除此之外,和普通类一致.
 *          但是允许final修饰的全局常量存在,但是一定是不会触发类加载的全局常量才允许
 *          字面值常量赋值的全局常量
 *
 *  总之，成员内部类的成员具有以下特点：
 *          可以定义普通成员变量，成员方法。但没有静态声明（包括静态变量，静态方法，静态代码块）
 *          有构造器，有构造代码块。
 *          可以有静态全局常量。（只允许那些不触发类加载的，这些常量编译器会直接存在常量池中，和变量特点不一样。可以认为和这个类完全没有关系）
 *
 *
 *      3. 继承和实现
 *          可以继承实现外部的类和接口,当然也可以继承实现内部类的类和接口
 *          实际使用中,我们使用成员内部类,多数都会考虑继承和实现
 *              比如: 不希望一个子类或者实现类被外界访问时,可以考虑使用成员内部类继承和实现.
 *
 * @since 09:42
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}
class EnclosedClazz{
    // 定义成员内部类
    private class InnerClazz extends Demo implements IA{
        int a;
        private int b = 10;
        // static int c;
        // static int test(){}
        // static {}
        private static final int D = 10;
        private static final String STRING = "abc";
        // private static final String STRING2 = new String();

        // 构造器

        public InnerClazz() {
        }

        public InnerClazz(int a, int b) {
            this.a = a;
            this.b = b;
        }

        public void test(){}

        // 代码块
        {

        }
    }
    class A{}
    interface IA{}
}